傅里叶变换(FFT)学习笔记

您所在的位置:网站首页 command block多项式计数 傅里叶变换(FFT)学习笔记

傅里叶变换(FFT)学习笔记

2024-01-13 20:39| 来源: 网络整理| 查看: 265

——傅里叶变换在信息学竞赛中主要作用是利用卷积思想,化乘为加,快速计算多项式乘法。

我太蒟了,看了$F(x)$篇博文,还是没看懂。

关于多项式,有了$O(nlogn)$乘法,就有了全世(jia)界(tong)!

$update(2019.6.27):$更新了一些证明和式子。

$update(2019.10.28):$发现模板题时限缩小,开始修锅(去冗余)。

当年写这篇文章的时候比较菜(现在仍然很菜),所以讲的比较含混不清,现在更新和精简了一些内容,希望能对大家有所帮助~

源码删去了17KB,更新了9KB内容。

文章中的代码已经进一步优化,可以通过模板题。

由于文章前后内容有所变化,已将讨论区清空。

警告 : 本文对数学水平有一定要求,如果发现看不懂,可以先存着。

另外,如果你掌握和式的话,学习速度将会大幅度提高。

此外,由于前面的内容太掉逼格,建议水平高的选手直接跳到“单位根”。

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -1.前置知识

1.线段树(或者基本分治):题目

2.基本数论:题目

3.码力:题目

4.基本数学:题目

然后在你刷完这些题之后,发现题和下面的内容并没什么关系。

附上一句,这是$\color{purple}\textsf{省选}$内容哦!(然而并没有什么影响)

$\color{Black}\colorbox{lightgreen}{总结一下}$

这里不会满屏都是三角函数!!,没有$e^i$和什么欧拉定理!!

不需要你会高数,只要用过平面直角坐标系,就可以看。

这篇文章源码40KB,写的时候挑战洛谷Blog(浏览器)性能极限

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 0.概(che)论(dan)

FFT全称(Fast Fourier Transformation)

中文名:快速傅里叶离散变换

作用 : 以$O(nlogn)$的复杂度计算多项式乘法(你以为呢?Of course more than that!)。

大家在学多项式乘法的时候,是不是觉得拆括号特别麻烦。

比如说计算$(x^2+3x-1)*(2x^2+x-5)$

原式$=x^2(2x^2+x-5)+3x(2x^2+x-5)-(2x^2+x-5)$

$\quad\ \ \ =(2x^4+x^3-5x^2)+(6x^3+3x^2-15x)-(2x^2+x-5)$

$\quad\ \ \ =2x^4+x^3-5x^2+6x^3+3x^2-15x-2x^2-x+5$

$\quad\ \ \ =2x^4+(x^3+6x^3)+(3x^2-2x^2-5x^2)+(-x-15x)+5$

$\quad\ \ \ =2x^4+7x^3-4x^2-16x+5$

很复杂...

现在我们就要用计算机把两个多项式乘起来(所谓多项式问题)。

P.S:下面提及的多项式均只有一元,你可以认为只有$x$这一元。

为了表述方便,下面定义一些记号(请仔细阅读):

$F(x)$表示一个多项式,简单的叫做“多项式$F$”。

$F(x)$是简便写法,比如我们设$F(x)=x^2+x+1$,以后我们提起$x^2+x+1$就不用那么啰嗦,直接说$F(x)$就好啦。

你也可以把它理解为函数,上面的$F(x)=x^2+x+1$

那么$F(5)=5^2+5+1=31$,非常和谐。

系数(参数)

这里有一个n次多项式$F(x)$

差不多长成这样:$a*x^n+b*x^{n-1}+c*x^{n-2}+...$

其中$a,b,c...$是参数,因为他们在系数的位置上,所以也叫系数.

用不同的字母来表示系数很烦,我们就用数组。

通常把$F(x)$的$n$次项系数称作$F[n]$。

也即$F(x)=\sum^{n}_{i=0}F[i]x^i$

乘法的本质(卷积)

现在如果让你把两个$n$次多项式$F(x)$和$P(x)$乘起来,你会怎么写程序?

简单啦!

设$C=A*B$(多项式).

$C[k]=\sum\limits_{i=0}^kA[i]B[k-i]$

理解:想要乘出$x^k$,需要$A$的$x^i$项和$B$的$x^{k-i}$项。

也就是说$A[i]B[k-i]$乘起来之后,他们后面的未知数就变成了$x^k$,所以要往$C[k]$贡献。

也可以写做等价的$C[k]=\sum\limits_{i+j==k}A[i]B[j]$(不懂没关系,看代码你就懂了)

形为$C[k]=\sum\limits_{i⊕j==k}A[i]B[j]$的式子称为卷积,其中$⊕$为某种运算。

那么你可能观察到了,多项式乘法就是加法卷积。

(后面我们还会学习到其他的卷积)

多项式乘法拥有交换律结合律分配率什么的,就不多说了……

亮出模板题

暴力卷积Code(用于上述模板题,44'):

#include #include #define Maxn 1000500 using namespace std; inline int read() { register int X=0; register char ch=0; while(ch57)ch=getchar(); while(ch>=48&&ch>b.y; CP c; c=a+b; cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3